package com.hongliang.nio_c1.nio;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;

import static com.hongliang.nio_c1.utils.ByteBufferUtil.debugRead;

/**
 * @author Hongliang Zhu
 * @create 2021-08-22 19:40
 */
@Slf4j
public class Server {

    public static void main(String[] args) throws IOException {
        // 使用NIO来理解阻塞模式
        // 0. ByteBuffer
        ByteBuffer buffer = ByteBuffer.allocate(16);
        // 1. 创建服务器
        ServerSocketChannel server = ServerSocketChannel.open();
        //*************************非阻塞************************************

        server.configureBlocking(false);

        //*************************************************************

        // 2. 绑定监听端口
        server.bind(new InetSocketAddress(8080));

        // 连接集合
        List<SocketChannel> channels = new ArrayList<>();
        // 3. 循环接受客户端连接请求
        while (true){
            // accept  建立与客户端的连接， SocketChannel用来与客户端之间通信
//            log.debug("Connecting...");
            SocketChannel sc = server.accept(); // 阻塞方法， 线程停止运行
            if (sc != null){
                log.debug("Connected for {}", sc);
                sc.configureBlocking(false); // 非阻塞模式
                channels.add(sc);
            }

            for (SocketChannel channel: channels){
                // 接受客户端发送的数据
//                log.debug("before read...{}", channel);
                int read = channel.read(buffer);// 阻塞方法， 线程停止运行
                if(read > 0){
                    buffer.flip();
                    debugRead(buffer);
                    buffer.clear();
                    log.debug("after read...{}", channel);
                }

            }

        }

    }
}
